from CDB import CDB

class AddressUnit:
    def __init__(self, cdb: CDB):
        self.busy = False  # 标志单元是否忙碌
        self.delay_time = 1  # 需要的周期数
        self.instruction = None  # 执行的指令
        self.current_clock = 0  # 当前的时钟周期
        self.start_clock = 0  # 开始时的时钟周期
        self.cdb = cdb
        self.predictions = {}  # 存储预测的计算结果，格式为 {entry_number: predicted_value}

    def issue_instr(self, instruction, current_clock):
        """
        发送指令到地址计算单元执行。
        :instruction: 要执行的指令。
        :current_clock: 当前的时钟周期。
        """
        if not self.busy:
            self.instruction = instruction
            self.start_clock = current_clock
            self.current_clock = current_clock
            self.busy = True

    def set_prediction(self, entry_number, predicted_value):
        """
        设置地址计算预测结果。
        :param entry_number: 条目编号。
        :param predicted_value: 预测的计算结果。
        """
        self.predictions[entry_number] = predicted_value
        print(f"Prediction set for entry {entry_number}: {predicted_value}")

    def execute(self):
        # 执行地址计算。
        if self.busy:
            self.current_clock += 1
            if self.current_clock - self.start_clock >= self.delay_time:
                result = 10
                try:
                    if isinstance(self.instruction, dict) and "instruction" in self.instruction:
                        number = self.instruction["instruction"].split()[2].strip('+')
                    elif isinstance(self.instruction, str):
                        number = self.instruction.split()[2].strip('+')
                    else:
                        number = "0"  # 默认值
                    result += int(number)
                except (IndexError, ValueError):
                    # 处理索引错误或值错误（如果转换失败）
                    pass

                # 使用预测结果，如果预测存在且正确
                entry_number = self.instruction.get("Entry", None) if isinstance(self.instruction, dict) else None
                if entry_number and entry_number in self.predictions:
                    predicted_value = self.predictions[entry_number]
                    print(f"Prediction for entry {entry_number}: {predicted_value}")
                    if predicted_value == result:
                        print(f"Prediction successful for entry {entry_number}. Using predicted value.")
                        result = predicted_value  # 使用预测值

                # 广播计算结果
                self.busy = False
                return result
        return None

    def clear_predictions(self):
        """
        清空预测数据。
        """
        self.predictions.clear()
        print("Predictions cleared.")
